package common;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Map;



/**
 * Interfaccia remota del Registration Server.
 * Il Registration Server ha lo scopo di garantire l'univocita' dei nickname dei 
 * player e dei gruppi di gioco. Permette la scoperta dei gruppi di gioco.
 * I player che si registrano presso il Registration Server ottengono la lista
 * dei gruppi di gioco. Per mezzo dell'interfaccia {@link PlayerIntf}, il 
 * Registration Server notifica i player quando gruppi di gioco vengono creati o 
 * rimossi.
 * Nota che ogni player puo' essere proprietario al piu' di un gruppo di gioco.
 * 
 * La registrazione del nome di un player o di un gruppo ha una scadenza, scaduta
 * la quale la registrazione viene rimossa. Nel caso di un gruppo, vengono anche
 * notificati tutti i player.
 */
public interface RegistrationServerIntf extends Remote {
	/**
	 * nome con cui viene effettuato il bind del registration server
	 */
	public static final String REGSRV= "RmiRegSrv";
	
	/**
	 * Aggiunge la registrazione di un player.
	 * Non viene notificato alcun player di questo evento.
	 * @param p player da registrare
	 * @return mappa fra nomi dei gruppi in attesa e dei relativi proprietari
	 * @throws DuplicateException nickname gia' usato
	 * @throws RemoteException
	 */
    public Map<String, PlayerIntf> addRegistration(PlayerIntf p) 
    		throws DuplicateException, RemoteException;
    
    /**
     * Rimuove la registrazione del player.
     * Non viene notificato alcun player di questo evento.
     * @param name il nome del player da rimuovere
     * @throws RemoteException
     */
    public void delRegistration(String name) throws RemoteException;
    
    /**
     * Proroga la scadenza per il nome del player passato come parametro. Se il
     * nome non e' presente non viene fatta alcuna operazione 
     * @param name nome del player di cui prorogare la scadenza
     * @return true se il nome e' presente, false altrimenti
     * @throws RemoteException
     */
    public boolean refreshPlayer(String name) throws RemoteException;
    
    /**
     * Registra un gruppo di gioco. Notifica tutti i player di questo evento,
     * compreso chi lo ha creato.
     * @param p proprietario di un gruppo di gioco
     * @param name nome del gruppo di gioco
     * @throws DuplicateException nome gia' usato
     * @throws RemoteException
     */
    public void addPlayGroup(PlayerIntf p, String name)
    		throws DuplicateException, RemoteException;
    
    /**
     * Rimuove il gruppo di gioco dato. Notifica tutti i player di questo evento,
     * compreso chi lo ha rimosso.
     * @param name nome del gruppo di gioco da rimuovere
     * @throws RemoteException
     */
    public void delPlayGroup(String name)
    		throws RemoteException;
    
    /**
     * Proroga la scadenza per il nome del gruppo passato come parametro. Se il
     * nome non e' presente non viene fatta alcuna operazione 
     * @param name nome del gruppo di cui prorogare la scadenza
     * @return true se il nome e' presente, false altrimenti
     * @throws RemoteException
     */
    public boolean refreshPlayGroup(String name) throws RemoteException;
    
    /**
     * Cambia il proprietario di un gruppo di gioco.
     * Questo e' utile quando il proprietario originario e' uscito dal gruppo
     * di gioco dal lui stesso creato.
     * I player non vengono notificati di questo evento: devono gestirsi da soli.
     * @param newOwner nuovo proprietario del gruppo di gioco
     * @param groupName gruppo di gioco di cui cambia il proprietario
     * @throws RemoteException
     */
    public void changePlayGroupOwner(PlayerIntf newOwner, String groupName)
    		throws RemoteException;
}
